package view.CommonView;

import java.awt.Color;
import java.net.URL;
import java.util.*;

import javax.swing.*;

import entity.User;
import utils.ComonUtil;
import view.LoginView;
import view.Listener.MainMenuBarListener;

/**
 * @Author: Lin Hongwei
 * @LastEditors: Lin Hongwei
 * @email: 1365755396@qq.com
 * @CSDN: https://blog.csdn.net/weixin_45429409
 * @Description: 自定义封装JFrame组件
 *
 */
public class CommonJFrame extends JFrame {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private String TITLE = "图书管理系统";

	private static MainMenuBarListener menuBarListener = new MainMenuBarListener();
	private User user;
	private static boolean isAdmin;
	private static String[] adminArr= {"基础维护","借阅管理"};
	public CommonJFrame() {
		String name = "  ";
		user = LoginView.getUser();
		if(user!=null) {
			name = " — " + user.getUserName();
			isAdmin = user.getAdmin()==1;
			String role = isAdmin?"(管理员)":"(读者)";
			name+=role;
		}
		
		
		
		setTitle(TITLE+name);
		setLocationRelativeTo(null);// 需要在setSize之后才会生效，设置相对于哪个组件的位置（null相当于屏幕中央）
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 点击关闭按钮关闭
		setResizable(false);// 是否允许调整大小
		
		/**
		 * 设置标题icon - Toolkit.getDefaultToolkit().getImage()：从资源路径中获取到图片资源 -
		 * LoginView.class.getResource(""):获取到资源路径
		 */
		URL iconUrl = LoginView.class.getResource("/img/book.png");// 获取到图片地址
		// setIconImage(Toolkit.getDefaultToolkit().getImage(iconUrl));
		setIconImage(new ImageIcon(iconUrl).getImage());
		// setUndecorated(true);//隐藏标题栏

	}

	// 初始化一些配置
	public CommonJFrame(String title) {
//		this();
		System.out.println(title);
		setTitle(title);// 设置标题
	}

	/**
	 * @deprecated
	 * @Description 设置对应的菜单
	 * @param{HashMap<String,String[]>} map - <菜单名字，菜单对应的子选项> @param{String[]}
	 *                                  fatherMenu - 最外层菜单名字队列
	 * @return{ArrayList<ArrayList<?>>}
	 */
	public static ArrayList<ArrayList<?>> setMenuBarList(JMenuBar menuBar, HashMap<String, String[]> map,
			String[] fatherMenu) {
		ArrayList<Object> menuList = new ArrayList<Object>();// JMenu集合，菜单集合
		ArrayList<Object[]> menuItemList = new ArrayList<Object[]>();// 每个子选项为一个（JMenuItem）数组，所有菜单子选项的集合（与菜单集合顺序对应）
		ArrayList<Object> itemList;// 添加每个菜单子选项的集合
		JMenu jMenu = null;// 声明一个菜单项
		JMenuItem jMenuItem = null;// 声明一个菜单项子选项
		for (String menuName : fatherMenu) {
			jMenu = new JMenu(menuName);// 创建一个菜单项目对象
			menuList.add(jMenu);// 添加进集合
			menuBar.add(jMenu);// 添加进菜单栏
			itemList = new ArrayList<Object>();
			for (String itemName : map.get(menuName)) {
				jMenuItem = new JMenuItem(itemName);
				itemList.add(jMenuItem);
				jMenu.add(jMenuItem);// 将子选项添加进菜单项中
				jMenuItem.addActionListener(menuBarListener);// 添加事件监听
			}
			menuItemList.add(itemList.toArray());
		}

		ArrayList<ArrayList<?>> countList = new ArrayList<ArrayList<?>>();
		countList.add(menuList);
		countList.add(menuItemList);

		return countList;
	}

	/**
	 * @Description 设置二级菜单
	 */
	public static void setMenuBarTowList(JMenuBar menuBar, String[] fatherMenu, String[][] childMenu,
			String[][][] itemMenu) {
		int fIndex = 0;// 第一层索引
		JMenu jMenu = null;// 声明一个菜单项
		JMenuItem jMenuItem = null;// 声明一个菜单项子选项
		for (String fatherName : fatherMenu) {
//			System.out.println("fatherName:"+fatherName);

			jMenu = new JMenu(fatherName);// 创建一个菜单项目对象
			menuBar.add(jMenu);// 添加进菜单栏
			
			if(!isAdmin) {
				boolean isAdminMenu = ComonUtil.getArrContain(adminArr, fatherName);
				if(isAdminMenu) {
					jMenu.setForeground(Color.gray);
					fIndex++;
					continue;
				}
			}
			
			int cIndex = 0;// 第二层索引
			for (String childName : childMenu[fIndex]) {
//				System.out.println("-childName:"+childName);
//				System.out.println("----"+itemMenu[fIndex].length);
				if (itemMenu[fIndex].length > 0) {// 存在二级菜单
					JMenu childJMenu = new JMenu(childName);// 声明一个二级菜单项
					jMenu.add(childJMenu);// 添加进一级菜单

					for (String itemName : itemMenu[fIndex][cIndex]) {
//						System.out.println("--itemName"+itemName);
						// 设置最后一级
						jMenuItem = setMenuItem(childJMenu, jMenuItem, itemName);
					}
				} else {
					jMenuItem = setMenuItem(jMenu, jMenuItem, childName);
				}
				cIndex++;
			}

			fIndex++;
		}
	}

	/**
	 * @Description 设置对应的条目
	 * @return
	 */
	private static JMenuItem setMenuItem(JMenu jMenu, JMenuItem jMenuItem, String name) {
		jMenuItem = new JMenuItem(name);// 创建对应的条目
		jMenu.add(jMenuItem);// 添加进对应的菜单
		jMenuItem.addActionListener(menuBarListener);// 添加最后一个选项的事件监听
		return jMenuItem;
	}

	/**
	 * @Description 获取到对应索引的menu对象
	 * @param menuList - menu菜单项目集合
	 * @return
	 */
	public static Object getMenu(ArrayList<?> menuList, int i) {
		Object[] menus = menuList.toArray();
		return menus[i];
	}

	/**
	 * @deprecated
	 * @Description 获取到对应索引的menu对象的子选项集合
	 * @param menuItemList - menu子选项集合（每一项为menu子选项对象数组）
	 * @return
	 */
	public static Object[] getMenuItem(ArrayList<?> menuItemList, int i) {
		Object[] menuItems = menuItemList.toArray();// 实际是一个二维数组
		Object[] menuItem = (Object[]) menuItems[i];// 获取到对应菜单下的子选项集合
		return menuItem;

		/*
		 * 取值的时候 ArrayList<ArrayList<?>> list =
		 * MainView.setMenuBarList(menuBar,menuMap); Object[] menuItems =
		 * list.get(1).toArray();//实际是一个二维数组 int i = 0; for(Object obj :list.get(0)) {
		 * System.out.println(obj); Object[] menuItem = (Object[])
		 * menuItems[i];//获取到对应菜单下的子选项集合 for(Object item : menuItem) {
		 * System.out.println(item); } i++; }
		 */
	}
}
